<!DOCTYPE HTML>
<html>
<head>
<title>Sample HTML5 API Tests</title>
</head>
<body onload="load_test_attr.done()">
<h1>Sample HTML5 API Tests</h1>
<div id="log"></div>
<script src="testharness.js"></script>
<script src="testharnessreport.js"></script>
<script>
    setup_run = false;
    setup(function() {
            setup_run = true;
          }, {timeout:6000});
    test(function() {assert_true(setup_run)}, "Setup function ran");

    // Two examples for testing events from handler and attributes
    var load_test_event = async_test("window onload event fires when set from the handler");

    function windowLoad()
    {
        load_test_event.done();
    }
    on_event(window, "load", windowLoad);

    // see the body onload below
    var load_test_attr = async_test("body element fires the onload event set from the attribute");
</script>
<script>
    function bodyElement()
    {
        assert_equals(document.body, document.getElementsByTagName("body")[0]);
    }
    test(bodyElement, "document.body should be the first body element in the document");

    test(function() {
        assert_equals(1,1);
        assert_equals(NaN, NaN, "NaN case");
        assert_equals(0, 0, "Zero case");
    }, "assert_equals tests")

    test(function() {
        assert_equals(-0, 0, "Zero case");
    }, "assert_equals tests expected to fail")

    test(function() {
        assert_not_equals({}, {}, "object case");
        assert_not_equals(-0, 0, "Zero case");
    }, "assert_not_equals tests")

    function testAssertPass()
    {
        assert_true(true);
    }
    test(testAssertPass, "assert_true expected to pass");

    function testAssertFalse()
    {
        assert_true(false, "false should not be true");
    }
    test(testAssertFalse, "assert_true expected to fail");
    
    function basicAssertArrayEquals()
    {
        assert_array_equals([1, NaN], [1, NaN], "[1, NaN] is equal to [1, NaN]");
    }
    test(basicAssertArrayEquals, "basic assert_array_equals test");

    function basicAssertObjectEquals()
    {
        assert_object_equals([1, 2, [1, 2]], { 0: 1, 1: 2, 2: { 0: 1, 1: 2} }, "array is equal to object")
    }
    test(basicAssertObjectEquals, "basic assert_object_equals test");

    function testAssertInherits() {
        var A = function(){this.a = "a"}
        A.prototype = {b:"b"}
        var a = new A();
        assert_exists(a, "a");
        assert_not_exists(a, "b");
        assert_inherits(a, "b");
    }
    test(testAssertInherits, "test for assert[_not]_exists and insert_inherits")

    test(function()
    {
        var a = document.createElement("a")
        var b = document.createElement("b")
        assert_throws("NOT_FOUND_ERR", function(){a.removeChild(b)});
    }, "Test throw DOM exception")

    test(function()
    {
        var a = document.createTextNode("a")
        var b = document.createElement("b")
        assert_throws("NOT_FOUND_ERR", function(){a.appendChild(b)});
    }, "Test throw DOM exception expected to fail")

    test(function()
    {
        var e = {code:0, name:"TEST_ERR", TEST_ERR:0}
        assert_throws("TEST_ERR", function() {throw e});
    }, "Test assert_throws with non-DOM-exception expected to Fail");

    var t = async_test("Test step_func")
    setTimeout(t.step_func(function (){assert_true(true); t.done();}), 0);

    async_test(function(t) {
        setTimeout(t.step_func(function (){assert_true(true); t.done();}), 0);
    }, "Test async test with callback");

    async_test(function() {
        setTimeout(this.step_func(function (){assert_true(true); this.done();}), 0);
    }, "Test async test with callback and `this` obj.");

    async_test("test should timeout (fail) with the default of 2 seconds").step(function(){});

    async_test("test should timeout (fail) with a custom set timeout value of 1 second",
               {timeout:1000}).step(function(){});

    async_test("async test that is never started, should have status Not Run", {timeout:1000});


</script>
</body>
</html>


 
